package me.pcqpcq.android.data;

import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.regex.Pattern;

import me.pcqpcq.android.Constant;
import me.pcqpcq.android.aclean.R;
import me.pcqpcq.android.mgr.ActivityMgr;
import me.pcqpcq.android.msg.MessageCentre;
import android.app.Activity;

/**
 * <p>数据类</p>
 * <p>此类用于取得需要清除的文件列表，默认升序</p>
 * <p>包括：</p>
 * <p>原始文件列表，升序及降序</p>
 * <p>空的文件列表</p>
 * <p>缓存及日志的文件列表</p>
 * <p>长时间未使用的文件列表</p>
 * @author pcqpcq
 *
 */
public class CleanListData {
	
	private static Activity curActivity = ActivityMgr.getCurActivity();

	// 空目录过滤器
	private static FileFilter emptyFilter = new FileFilter() {

		@Override
		public boolean accept(File pathname) {
			MessageCentre.updateProgressDlg(curActivity.getString(R.string.pd_cleanning_dir_empty), pathname.getAbsolutePath());
			if (PathStorageData.getPathStorage(pathname) > 0)
				return false;
			else
				return true;
		}

	};

	// 缓存目录过滤器
	private static FileFilter cacheFilter = new FileFilter() {

		@Override
		public boolean accept(File pathname) {
			MessageCentre.updateProgressDlg(curActivity.getString(R.string.pd_cleanning_dir_cache), pathname.getAbsolutePath());
			String absolutePath = pathname.getAbsolutePath();
			String tempRegex = "^(.*?)(t|T)(e|E)(m|M)(p|P)(.*?)$"; // 匹配缓存temp，不区分大小写
			String cacheRegex = "^(.*?)(c|C)(a|A)(c|C)(h|H)(e|E)(.*?)$"; // 匹配缓存cache，不区分大小写
			String logRegex = "^(.*?)(l|L)(o|O)(g|G)(.*?)$"; // 匹配日志log，不区分大小写
			String tmpRegex = "^(.*?)(t|T)(m|M)(p|P)(.*?)$"; // 匹配日志tmp，不区分大小写
			if (Pattern.matches(tempRegex, absolutePath) || Pattern.matches(cacheRegex, absolutePath)
					|| Pattern.matches(logRegex, absolutePath) || Pattern.matches(tmpRegex, absolutePath)) {
				return true;
			}
			return false;
		}

	};

	/**
	 * 取得指定目录下的“所有文件”列表，升序
	 * @return 文件列表
	 */
	public static List<File> getListAsc(File pathname) {
		if (pathname != null && pathname.exists() && pathname.canRead() && pathname.isDirectory()) {
			File[] fileArray = pathname.listFiles();
			List<File> fileList = Arrays.asList(fileArray);
			Collections.sort(fileList);
			return fileList;
		} else
			return null;
	}

	/**
	 * 取得指定目录下的“所有文件”列表，降序
	 * @return 文件列表
	 */
	public static List<File> getListDesc(File pathname) {
		if (pathname != null && pathname.exists() && pathname.canRead() && pathname.isDirectory()) {
			List<File> fileList = getListAsc(pathname);
			Collections.reverse(fileList);
			return fileList;
		} else
			return null;
	}

	/**
	 * 取得指定目录下的“单文件，非目录”列表，升序
	 * @return 文件列表
	 */
	public static List<File> getListFile(File pathname) {
		if (pathname != null && pathname.exists() && pathname.canRead() && pathname.isDirectory()) {
			List<File> fileList = getListAsc(pathname);
			List<File> newList = new ArrayList<File>();
			for (int i = 0; i < fileList.size(); i++) {
				if (fileList.get(i).isFile())
					newList.add(fileList.get(i));
			}
			return newList;
		} else
			return null;
	}

	/**
	 * 取得指定目录下的“空目录”列表，升序
	 * @return 文件列表
	 */
	public static List<File> getEmptyList(File pathname) {
		if (pathname != null && pathname.exists() && pathname.canRead() && pathname.isDirectory()) {
			File[] fileEmptyArray = pathname.listFiles(emptyFilter);
			List<File> fileList = Arrays.asList(fileEmptyArray);
			Collections.sort(fileList);
			return fileList;
		} else
			return null;
	}

	/**
	 * 取得指定目录下的“缓存或日志”列表，升序
	 * @return 文件列表
	 */
	public static List<File> getCacheList(File pathname) {
		if (pathname != null && pathname.exists() && pathname.canRead() && pathname.isDirectory()) {
			File[] fileCacheArray = pathname.listFiles(cacheFilter);
			List<File> fileList = Arrays.asList(fileCacheArray);
			Collections.sort(fileList);
			return fileList;
		} else
			return null;
	}

	/**
	 * 取得指定目录下“days天未使用”的文件列表
	 * @param days 天数
	 * @return 文件列表
	 */
	public static List<File> getUselessList(File pathname, int days) {
		if (pathname != null && pathname.exists() && pathname.canRead() && pathname.isDirectory()) {
			long lastTime = System.currentTimeMillis() - days * Constant.DAY_TIME_IN_MILLISECOND;
			File[] fileModifiedArray = pathname.listFiles();
			List<File> fileList = new ArrayList<File>();
			for (int i = 0; i < fileModifiedArray.length; i++) {
				MessageCentre.updateProgressDlg(curActivity.getString(R.string.pd_cleanning_dir_useless), fileModifiedArray[i].getAbsolutePath());
				long modifyTime = fileModifiedArray[i].lastModified();
				if (modifyTime < lastTime)
					fileList.add(fileModifiedArray[i]);
			}
			Collections.sort(fileList);
			return fileList;
		} else
			return null;
	}

}
